//基础类型
(()=>{
console.log(2);
const {log} = console

 //let 变量名 :变量类型 = 赋值
 //boolean  
 let falg:Boolean = true
 log(falg);

 //Number
 let num1:Number = 1
 log(num1)
 //String
 let str:String = '哈哈'
 log(str)


 //null和 undefined 可以作为 其他任意类型的子类 也就是说可以是其他类型的变量的值
 let und :undefined = undefined
 let nul :null = null

 log(nul)
 log(und)
let num2:number = null
log(num2)
let str2:string = undefined
log(str2)


//数组 
//数组类型1  let 变量名字 : 类型 [] = [值]  指定了值的类型
let arr1:number[] = [1,2,3,4]
log(arr1)
//数组类型2   let 变量名 :大写类型<类型> = [值]
let arr2 :Array<number> = [1,2,null,undefined]
log(arr2)
// 元组
  //元组类型 一开始就指定了 长度 类型 
let arr3:[string,number,boolean] = ['小红',2,true]
log(arr3)
log(arr3[0].split(''))

//枚举 enum  枚举类型里面的每个数据值 都称为元素, 每个元素都有自己的编号 从0开始,依次➕1
enum Color {
 red,
 yellow,
 blue
}
let color:Color = Color.blue
log(color) //2
log(Color.red,Color.yellow,Color.blue) //取值是下标 
log(Color[0]) //red

//any 类型  动态类型 任意类型  不确定当前类型
let s :any =122
log(s)
s = 'string'
log(s)

let arr4:any[] = [1,'any类型',true,null,undefined]
log(arr4)
// 缺点 
// log(arr4[0].split(''))//没报错

//void 类型  该函数没有返回值 
function showMMsg():void{
 log('输出内容')
}
log(showMMsg())


//Object类型  定义一个函数 接受object参数  返回object类型
function getObj(obj:object):object{
 console.log(obj);
  return {
   name:'佐助'

  }
}
console.log(getObj({name:'┐(T.T ) ( T.T) ノ'}));
console.log(getObj(new String));
console.log(getObj([]));


//联合类型 表示取值可以为多种的其中一种  |
function getLength(str:string|number):number{
 //如果有length属性 则传进来的是字符串
 //类型断言 <类型> 变量
   if((<string> str).length){
    //类型断言  变量 as  类型
     return (str as string).length
   }else{
    return str.toString().length
   }
}
log(getLength('啊哈哈哈'))


//类型推断 
let a = 100
//默认认为是 number类型
log(a)

let b ;
//声明未赋值  默认为any类型
b=0;
b='ahh'

})()